package com.quantoeugasto.persistencia;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import com.quantoeugasto.entidade.Entidade;;;

/**
 * Superclasse de persistencia. Contém a referência ao EntityManager e
 * deve ser herdada por todas as classes de persistência do sistema.
 * 
 * @author Fabiano
 */
@SuppressWarnings({ "unchecked", "rawtypes" })
public abstract class Persistencia <E extends Entidade>{

	@PersistenceContext
	private EntityManager em;

	/**
	 * @return the em
	 */
	protected EntityManager getEm() {
		return this.em;
	}

	/**
	 * Insere uma entidade no banco de dados. Deve possui a chave prim�ria nula.
	 * 
	 * @param entidade Entidade a ser inserida.
	 */
	public void inserir(E entidade){
		this.em.persist(entidade);
	}
	
	/**
	 * Altera uma entidade no banco de dados. Se a entidade possui a chave prim�ria nula,
	 * ela ser� inserida.
	 * 
	 * @param entidade Entidade a ser alterada.
	 */
	public void alterar(E entidade){
		this.em.merge(entidade);
	}
	
	/**
	 * Exclui uma entidade do banco de dados.
	 * @param entidade Entidade a ser exclu�da. Deve possui a chave prim�ria preenchida.
	 */
	public void excluir(E entidade){
		this.em.remove(entidade);
	}
	
	/**
	 * Consulta uma entidade no banco de dados.
	 * 
	 * @param entidade Entidade contendo a chave prim�ria a ser pesquisada.
	 * @return A entidade referente � chave prim�ria fornecida. Retornar� null caso
	 * 		n�o tenha sido encontrado um registro com a chave.
	 */
	public E consultar(E entidade){
		return (E) this.getEm().find(entidade.getClass(), entidade.obterChavePrimaria());
	}
	
}
